package io.gitee.welson.sensitive.util;

import org.springframework.util.StringUtils;

/**
 * 脱敏工具类
 *
 * @author welson
 */
public class SensitiveUtil {

    /**
     * 创建指定长度的掩码（*）
     *
     * @param length 掩码长度
     * @return 掩码字符串
     */
    public static String createMask(int length) {
        if (length <= 0) {
            return "";
        }
        StringBuilder mask = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            mask.append('*');
        }
        return mask.toString();
    }

    /**
     * 对字符串进行掩码处理，保留前后指定位数
     *
     * @param value 原始值
     * @param keepPrefix 保留前几位
     * @param keepSuffix 保留后几位
     * @return 掩码后的值
     */
    public static String mask(String value, int keepPrefix, int keepSuffix) {
        // 空值校验
        if (!StringUtils.hasText(value)) {
            return value;
        }

        int length = value.length();
        
        // 如果保留的位数超过原始长度，直接返回原值
        if (keepPrefix + keepSuffix >= length) {
            return value;
        }

        // 构建掩码后的值
        StringBuilder masked = new StringBuilder();
        
        // 添加前缀
        if (keepPrefix > 0) {
            masked.append(value.substring(0, keepPrefix));
        }
        
        // 添加掩码
        masked.append(createMask(length - keepPrefix - keepSuffix));
        
        // 添加后缀
        if (keepSuffix > 0) {
            masked.append(value.substring(length - keepSuffix));
        }

        return masked.toString();
    }

    /**
     * 检查字符串是否为空或者长度不足
     *
     * @param value 待检查的字符串
     * @param minLength 最小长度要求
     * @return 如果字符串为空或长度不足，返回true
     */
    public static boolean isInvalid(String value, int minLength) {
        return !StringUtils.hasText(value) || value.length() < minLength;
    }

    /**
     * 判断字符串是否有效（非空且长度足够）
     *
     * @param value 待检查的字符串
     * @param minLength 最小长度要求
     * @return 如果字符串非空且长度足够，返回true
     */
    public static boolean isValid(String value, int minLength) {
        return StringUtils.hasText(value) && value.length() >= minLength;
    }
} 